昨天我們講解了index template以及如何建構和使用,也實際操作了index template以及component template,在建立新的index時會如何對照。今天我們來講一下基於template,後續建構的Datastream。
先前我們有簡單介紹過,Data Stream其實就像流水一樣,可以想像成是Data不斷的流經我們的Elasticsearch,因此Data Stream適用於大量連續的時間序列資料。通常量越大,時間性明顯的資料,使用Data Stream,時間成本消耗差異會非常明顯。
而它的原理其實就是透過相關聯的Indices,將大量的時間序列資料分散儲存,達到儲存以及查詢上的效率增加。
因此整個DataStream主要提供以下兩點:
使用時間如下:
統整一下,DataStram提供一個簡單的request標的,使你能夠輕易地對後面大量的indices做requests,同時也能夠更有效率儲存大量的indices
使用時機就是當資料是大量且時序資料,並且具有不須刪除或更新的狀態下(不斷往下疊加)這種特性,就可以考慮使用DataStream作為input。
Data Stream自動生成背後隱藏的indices
request請求背後DataStream流程
首先建立DataStream,我們可以先建構一個ILM(index lifecycle management )的Policy,意思是因為會生成一些暫時隱藏的backup indices,
PUT /_ilm/policy/my-data-stream-policy
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": {
"max_size": "25GB"
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
將大小設定在25GB,並且讓停留時間是30days
這裡大家應該也大概知道index template得用途了,就是為了去configure建構出來的back up indices
我們設定一個index template,pattern就是my-data-stream*,後面接任何東西,接著將ILM的設定透過settings匯入。
另外設定一個mapping field @timestamp,類型是date_nanos。
PUT /_index_template/my-data-stream-template
{
"index_patterns": [ "my-data-stream*" ],
"data_stream": { },
"priority": 200,
"template": {
"mappings": {
"properties": {
"@timestamp": { "type": "date_nanos" }
}
},
"settings": {
"index.lifecycle.name": "my-data-stream-policy"
}
}
}
接著我們直接透過request _doc建立index以及匯入document。
這邊我們透過對my-data-stream POST一個_doc的request,如此一來他就會自己建構my-data-stream這個index,並且匯入我們這個json。
而這個index符合我們在index template中的設定,因此就會套入設定
POST /my-data-stream/_doc/
{
"@timestamp": "2020-12-06T11:04:05.000Z",
"user": {
"id": "vlb44hny"
},
"message": "Login attempt failed"
}
接著我們看一下匯入後的回應
{
"_index": ".ds-my-data-stream-000001",
"_type": "_doc",
"_id": "70xl33QBY_yROqwhRrJE",
"_version": 1,
"result": "created",
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"_seq_no": 0,
"_primary_term": 1
}
可以看到_index部分是.ds-my-data-stream-000001,這就是我們剛剛提到的backup indices
檢視剛剛上船的資料,我們可以透過對這個data stream進行index層級的操作,他會直接幫你matching這些backup indices
GET /my-data-stream/_search
回覆如下:
{
"took": 0,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 1,
"relation": "eq"
},
"max_score": 1.0,
"hits": [
{
"_index": ".ds-my-data-stream-000001",
"_type": "_doc",
"_id": "70xl33QBY_yROqwhRrJE",
"_score": 1.0,
"_source": {
"@timestamp": "2020-12-06T11:04:05.000Z",
"user": {
"id": "vlb44hny"
},
"message": "Login attempt failed"
}
}
]
}
}
可以看到我們可以透過my-data-stream的request,找到剛剛那則文件,而他的_index欄位同樣是".ds-my-data-stream-000001"
而跟index一樣,我們也可以在index層級中,透過逗號分隔去查詢多個data stream
GET /my-data-stream,my-data-stream-alt/_search
{
"query": {
"match": {
"user.id": "8a4f500d"
}
}
}
也可以透過正規表示去查詢data stream
GET /my-data-stream*/_search
{
"query": {
"match": {
"user.id": "vlb44hny"
}
}
}
透過針對datastream進行_rollover的request,會新增新的backup indices。
request完後,會發現backup indices新增了
.ds-my-data-stream-000002
POST /my-data-stream/_rollover/
另外可以透過_cat indices,加上條件限制找到符合的data stream backup indices。
GET /_cat/indices/my-data-stream?v&s=index&h=index,status
可以看到這些indices是open或是close,基本上沒特別關掉的都會open,而close可能是手動關閉或是lifecycle到期了之後關閉的。
而關閉的backup indices不能刪除,但可以對它進行重新開啟。
POST /my-data-stream/_open/